package dao.LibraryDao;

import dao.BaseDao;
import common.model.Entity.libraryEntity.Book;

import java.util.List;
import java.util.Optional;

/**
 * 图书数据访问接口。
 *
 * <p>负责 {@link Book} 实体的 CRUD 操作及与业务相关的查询。</p>
 */
public interface BookDao extends BaseDao<Book,Long> {

    /**
     * 根据 ISBN 查询图书。
     * @param isbn 图书 ISBN
     * @return 查询到的图书，若不存在则返回 {@link Optional#empty()}
     */
    Optional<Book> findByIsbn(String isbn);

    /**
     * 根据分类 ID 查询图书列表。
     * @param categoryId 分类 ID
     * @return 图书列表，若不存在则返回空列表
     */
    List<Book> findByCategoryId(String categoryId);

    /**
     * 根据关键字全局搜索图书（书名、作者、出版社等字段模糊匹配）。
     * @param keyword 搜索关键字
     * @return  匹配的图书列表，若不存在则返回空列表
     */
    List<Book> searchBooks(String keyword);

    /**
     * 按指定字段和关键字搜索图书。
     * @param keyword 搜索关键字
     * @param searchType 搜索字段，如 "title"、"author"、"publisher"
     * @return 匹配的图书列表，若不存在则返回空列表
     */
    List<Book> searchBooksByField(String keyword, String searchType);

    /**
     * 更新图书的库存与可借数量。
     *
     * @param isbn 图书 ISBN
     * @param newStock 新的库存总量
     * @param newAvailable 新的可借数量
     * @return 更新成功返回 {@code true}，否则返回 {@code false}
     */
    boolean updateStockAndAvailable(String isbn, int newStock, int newAvailable);

    /**
     * 根据图书 ID 统计数量（用于校验存在性或重复性）。
     *
     * @param bookId 图书 ID
     * @return 匹配的记录数
     */
    long count(String bookId);

    /**
     * 根据 ISBN 删除图书。
     * @param isbn 图书 ISBN
     * @return 删除成功返回 {@code true}，否则返回 {@code false}
     */
    boolean deleteByIsbn(String isbn);

}
